import input
import output
import gen
import graph


def main():
    graph.init()
    api_ls = input.read_apis()  # {地址: [名称, API 类型, 类别]}
    mash_ls = input.read_mashups()  # {名称: 类别}
    rel_ls = input.read_relations()  # {名称: [地址...]}
    print('========== 1 ==========')
    # 统计有效 Mashup 的 Web API 个数
    api_cnt = 00
    api_used_ls = set()  # 用于记录哪些 API 是被 Mashup 实际调用了的
    for mash in mash_ls.keys():
        if mash in rel_ls.keys():
            for api in rel_ls[mash]:  # 该 Mashup 对应的所有 API 地址
                if api in api_ls.keys():  # 若 API 列表存在该地址
                    api_cnt += 1
                    api_used_ls.add(api)
    print("Mashup 中包含的有效 Web API 个数为: %d" % api_cnt)
    # 统计 API 使用次数
    api_use_cnt = gen.use_cnt(api_ls, mash_ls, rel_ls)  # {API 名称: 次数}
    output.write_api_use_cnt(api_use_cnt)
    # 统计不同 Web API 供应商提供的 API 个数
    api_prov = gen.prov_cnt(api_ls, mash_ls, rel_ls)  # {供应商名称: 个数}
    output.write_api_provider_cnt(api_prov)
    print('========== 2 ==========')
    # 按类别生成 API 字典
    cate_api = gen.category_api(api_ls)  # {类别: [地址...]}
    cate_mash_api = gen.category_mash_api(api_ls, api_used_ls)  # {类别: [地址...]}，这里只包含实际被 Mashup 调用了的 API
    cate_rate = {}
    cate_cnt = {}
    # 按类别统计使用率
    for cate in cate_mash_api.keys():
        cate_cnt[cate] = [len(cate_mash_api[cate])]
        cate_rate[cate] = float(len(cate_mash_api[cate]))  # 分子
    for cate in cate_api.keys():
        if cate in cate_rate.keys():
            cate_cnt[cate].append(len(cate_api[cate]))
            cate_rate[cate] /= float(len(cate_api[cate]))  # 除以分母
        else:
            cate_rate[cate] = 0
            cate_cnt[cate] = [0, len(cate_api[cate])]
    cate_rate = output.write_category_rate(cate_rate, cate_cnt)
    # 绘制结果条形图
    graph.category_rate(cate_rate)
    print('========== 3 =========')
    # 统计每种 Mashup 不同 API 的类型组合
    api_type_cnt = gen.api_type_set_cnt(api_ls, mash_ls, rel_ls)  # {(类型集合): 次数}
    type_rate = output.write_api_type_cnt(api_type_cnt)
    # 绘制结果饼图
    graph.api_type_rate(type_rate)


if __name__ == '__main__':
    main()
